#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

/*************************bmp的封装*****************************/
/*
    显示800*480的bmp图片
*/
int show_bmp(int *addr, char *bmp_path)
{
    // 打开bmp图片
    int fd_bmp = open(bmp_path, O_RDWR);
    if (fd_bmp < 0)
    {
        printf("open bmp fail\n");
        return -1;
    }

    // 去除掉图片的头54字节
    lseek(fd_bmp, 54, SEEK_SET);

    // 读取bmp图片的数据
    char buf[800 * 480 * 3] = {0};
    read(fd_bmp, buf, 800 * 480 * 3);

    // 通过lcd的映射的指针直接给lcd刷图片
    int x = 0; // 横轴
    int y = 0; // 纵轴
    for (y = 0; y < 480; y++)
    {
        for (x = 0; x < 800; x++)
        {
            // bmp图片读取的方式：从左到右从下到上
            //  *(addr + y * 800 + x) = 鸡哥图片的数据;
            //  0 = buf[0] | buf[1]<<8 |buf[2]<<16
            //  1 = buf[3] | buf[4]<<8 |buf[5]<<16
            //  2 = buf[6] | buf[7]<<8 |buf[8]<<16
            //  800 = buf[2400] | buf[2401]<<8 |buf[2402]<<16
            //  *(addr + xy表达式) = buf[xy表达式] | buf[xy表达式] << 8 | buf[xy表达式] << 16;
            *(addr + (479 - y) * 800 + x) = buf[(y * 800 + x) * 3 + 0] |
                                            buf[(y * 800 + x) * 3 + 1] << 8 |
                                            buf[(y * 800 + x) * 3 + 2] << 16;
        }
    }

    close(fd_bmp);
}

/*
    显示任意大小的bmp图片(宽度和高度必须是4的倍数)
*/
int show_bmp_size(int *addr, char *bmp_path, int offset_x, int offset_y)
{

    // 打开bmp图片
    // int fd_bmp = open("./kun300.bmp", O_RDWR); //300*200
    int fd_bmp = open(bmp_path, O_RDWR);
    if (fd_bmp < 0)
    {
        printf("open bmp fail\n");
        return -1;
    }

    // 计算图片的宽度和高度
    int width = 0;  // 宽度
    int height = 0; // 高度
    lseek(fd_bmp, 18, SEEK_SET);
    read(fd_bmp, &width, 4);
    read(fd_bmp, &height, 4);
    printf("width:%d height:%d\n", width, height);

    // 去除掉图片的头54字节
    lseek(fd_bmp, 54, SEEK_SET);

    // 读取bmp图片的数据
    char buf[width * height * 3]; // 变成数组不能初始化
    read(fd_bmp, buf, 800 * 480 * 3);

    // 通过lcd的映射的指针直接给lcd刷图片
    int x = 0; // 横轴
    int y = 0; // 纵轴
    // int offset_x = 100; // bmp图片的起始坐标位置(offset_x,offset_y)
    // int offset_y = 100;
    for (y = 0; y < height; y++)
    {
        for (x = 0; x < width; x++)
        {
            // bmp图片读取的方式：从左到右从下到上
            *(addr + (offset_y + height - 1 - y) * 800 + offset_x + x) = buf[(y * width + x) * 3 + 0] |
                                                                         buf[(y * width + x) * 3 + 1] << 8 |
                                                                         buf[(y * width + x) * 3 + 2] << 16;
        }
    }

    close(fd_bmp);
}